<?php
/** ================================
 *  Intellect Board 3
 *  http://intblite.ru
 *  Модуль интерактивной части работы с пользовательскими профилями (регистрация, активация, восстановление пароля и т.п.)
 *
 *  ================================ */


class user extends Module {

  function action_login() {
    global $app;
    if ($app->user->is_guest() && $app->is_post()) {
      $t_check=true;
      if ($app->load_module('antibot',false)) { // подгружаем модуль antibot, чтобы проверить таймаут (защита от подобра пароля перебором)
        $antibot = new antibot;
        //TODO: сделать этот параметр задаваемым, а также зависимым от уровня безопасности на форуме
        if (!$antibot->timeout_check('user_login',3)) {
          $app->message('После предыдущей попытки входа должно пройти не менее 3 секунд!',2);
          $t_check=false;
        }
      }
      if ($t_check) { // если проверка таймаута прошла успешно
        if ($app->user->do_login($_POST['login'],$_POST['password'],isset($_POST['long']))) {
          $app->mode=1;
          $app->location=$app->referer();
          $app->message('Рады видеть вас снова, '.$app->user->get_name().'!',1);
          return;
        }
        else $app->message('Вход не удался! Проверьте, правильно ли вы вводите логин и пароль.',2);
      }
    }
    $result = new Html('login','user');
    $result->set('referer',$app->referer());
    return $result;
  }

  function action_logout() {
    global $app;
    $app->user->do_logout();
    $app->message('Вы вышли с форума!',1);
    $app->mode=1;
    $app->location=$app->referer();
    return false;
  }

  function action_register2() {
    global $app;
    $result = false;
    $data = array();

    if ($app->is_post()) { // если форма заполнена и отправлена, производим регистрацию пользователя
      $result = true;
      $data=$_POST; // берем данные из формы

      if ($data['basic']['password']!=$data['password2']) {
        $app->message('Пароль не совпадает с подтверждением!',3);
        $result =false;
      }
      else {
        $app->load_module('userlib',true); // загружаем модуль библиотеки типовых действий над профилем пользователя, если это не получится, выбрасываем ошибку
        $userlib = new userlib;
        $result = $userlib->register_user($data);
        if ($result) { // если зарегистрировались успешно
          $app->message('Пользователь зарегистрирован!',1);
          $app->mode = 1;
          $app->location=$app->referer();
          return;
        }
      }
    }

    if (!$result) { // если при регистрации пользователя произошла ошибка
      $regform=new Html('register','user');
      $regform->set_all($data);
      $regform->set('referer',$app->referer());
      return $regform;
    }
  }

  function action_edit() {
    global $app;
    $result = false;

    if ($app->is_post()) { // если форма заполнена и отправлена, производим регистрацию пользователя
      $result = true;
      $data=$_POST; // берем данные из формы

      if ($data['basic']['password'] && $data['basic']['password']!=$data['password2']) { // если пароль не пуст
        $app->message('Пароль не совпадает с подтверждением!',3);
        $result =false;
      }
      else {
        $app->load_module('userlib',true); // загружаем модуль библиотеки типовых действий над профилем пользователя, если это не получится, выбрасываем ошибку
        $userlib = new userlib;
        $result = $userlib->update_user($data);
        if ($result) { // если изменения в профиль внесены успешно
          $app->message('Профиль пользователя отредактирован!',1);
          $app->mode = 1;
          $app->location=$app->referer();
          return;
        }
      }
    }
    else $data['basic']=$app->user->load_user($app->user->get_uid()); // иначе данные берем из сессии пользователя // TODO: подумать, не загружать ли обновление настроек принудительно

    if (!$result) { // если при регистрации пользователя произошла ошибка
      $regform=new Html('edit','user');
      $regform->set_all($data);
      $regform->set('referer',$app->referer());
      return $regform;
    }
  }

  function action_view() {
    trigger_error('Еще не реализовано!',E_USER_ERROR);
  }

  function action_activate() {
    global $app;

    $activation=$app->get_opt('user_activation');
    if ($activation==0) {
      $app->message(array('level'=>1,'text'=>'Активация на сайте не требуется! Вы можете просто войти, используя логин и пароль!'));
    }
    elseif ($activation!=1) { // если режим активации не 1
      $app->message(array('level'=>3,'text'=>'На данном сайте запрещена самостоятельная активация пользователей через Email!'));
    }
    else {
      if ($app->load_module('antibot',false)) { // подгружаем модуль antibot, чтобы проверить таймаут (защита от подобра ключа перебором)
        $antibot = new antibot;
        if (!$antibot->timeout_check('user_activate',2)) {
          $app->mode=1;
          $app->message('После предыдущей попытки активации должно пройти не менее 2 секунд!',2);
          return;
        }
      }
      if (isset($_REQUEST['authkey']) && !$app->user->is_guest()) { //если пользователь залогинился со своим номером и успешно аутентифицировался по ключу
        $data['id']=$_REQUEST['uid'];
        $data['active']='1';
        $app->user->update_profile($data); // вызываем функцию изменения профиля
        $app->message(array('level'=>1,'text'=>'Пользователь успешно активирован! Теперь вы можете войти на форум!'));
        $app->location=$app->referer(); // отправляем пользователя на корневую страницу

        $data=$app->user->load_user($_REQUEST['uid']); // входим на форум
        $app->user->set_user($data);
      }
      else {
        $app->message(array('level'=>3,'text'=>'Не удалось активировать пользователя: неправильный ключ или номер пользователя!'));
      }
    }
  }

  /** Показ формы для восстановления пароля и отправка пароля на почту.
   *
   * @global Application $app
   * @return Html
   */
  function action_password_forgot() {
    global $app;
    if ($app->is_post()) {
      if (isset($_POST['login']) && $_POST['login']) $sqldata='login="'.$app->slashes($_POST['login']).'"';
      elseif (isset($_POST['email']) && $_POST['email']) $sqldata='email="'.$app->slashes($_POST['email']).'"';
      elseif (isset($_POST['uid']) && $_POST['uid']) $sqldata='id='.intval($uid);
      $sql = 'SELECT id, email FROM '.DB_prefix.'user WHERE '.$sqldata;
      $udata = $app->db->select_row($sql);
      if ($udata==false) $app->message('Пользователь с такими параметрами не найден!',3);
      elseif ($udata['id']<=AUTH_SYSTEM_USERS) $app->message('Попытка запросить восстановление пароля невозможна для спец. пользователя!',3);
      else {
        $key = $app->db->gen_auth_key($udata['id'],'password_reset');
        $mail = new Html('mforgot','user');
        $mail->set('key',$key);
        $app->mail(array('to'=>$udata['email'],'subj'=>'Восстановление пароля форума','text'=>$mail));
        $app->message('На ваш почтовый ящик, указанный при регистрации, отправлена ссылка, по которой можно сменить пароль.',1);
        $app->mode=1;
      }
    }
    $result = new Html('forgot','user');
    return $result;
  }

  function action_password_reset() {
    global $app;
    $uid=$_REQUEST['uid'];
    if ($app->load_module('antibot',false)) { // подгружаем модуль antibot, чтобы проверить таймаут (защита от подобра ключа перебором)
      $antibot = new antibot;
      if (!$antibot->timeout_check('user_password_reset',2)) {
        $app->mode=1;
        $app->message('После предыдущей попытки смены пароля должно пройти не менее 2 секунд!',2);
        return;
      }
    }
    if (isset($_REQUEST['authkey']) && !$app->user->is_guest()) { //если пользователь залогинился со своим номером и успешно аутентифицировался по ключу
      if ($app->is_post()) {
        if ($_POST['password']!=$_POST['password2']) $app->message('Введенные пароли не совпадают!',3);
        else {
          $crypt_mode=$app->get_opt('user_pass_crypt'); // проверяем, какой режим шифрования задан в настройках форума. Если он равен -1, значит, пользователь может сам выбирать, шифровать ему пароль или нет
          if ($crypt_mode==-1) $data['basic']['pass_crypt']=($crypt_mode==-1) ? 1 : $crypt_mode; // если пользователь ничего не выбрал, пароль не шифруем
          if ($app->user->update_profile(array('id'=>$uid,'password'=>$_POST['password'],'password_crypt'=>$crypt_mode))) {
            $app->mode=1;
            $app->message('Пароль успешно изменен!',1);
            $app->auth->do_login($app->auth->get_name(),$_POST['password']); // и сразу же входим на форум
            $app->location=$app->referer();
          }
        }
      }
      $result =new Html('reset','user');
      $result->set_all($_REQUEST);
      return $result;
    }
    else {
      $app->mode=1;
      $app->message('Неправильный ключ идентификации пользователя!',3);
    }
  }

  /** Смена почтового ящика для неактивированного пользователя с вводом пароля.
   * Нужна на случай, если пользователь ошибся при указании EMail или письмо не доходит на указанный адрес. **/
  function action_change_email() {
    global $app;
    $activation=$app->get_opt('user_activation');
    if ($activation!=1) {
      $app->mode=1;
      if ($activation==0) $app->message('На данном форуме выключена активация через ящик пользователя. Просто войдите под своим логином/паролем и исправьте адрес.',2);
      if ($activation==2) $app->message('На данном форуме активация осуществляется администратором. Дождитесь, когда он это сделает!',2);
      return;
    }
    if ($app->is_post()) {
      if ($app->load_module('antibot',false)) { // подгружаем модуль antibot, чтобы проверить таймаут (защита от подобра ключа перебором)
        $antibot = new antibot;
        if (!$antibot->timeout_check('user_change_email',5)) {
          $app->mode=1;
          $app->message('После предыдущей попытки смены адреса должно пройти не менее 5 секунд!',2);
          return;
        }
      }
      $uid = $app->user->get_uid_by_name($_POST['login']);
      if (!$app->valid_email($email)) $app->message('Указан некорректный новый адрес электронной почты!',3);
      elseif (!$app->user->check_password($uid, $_POST['password'])) $app->message('Неправильно введен пароль пользователя!',3);
      else {
        if ($app->user->update_profile(array('id'=>$uid,'email'=>$_POST['email']))) {
          $app->mode=1;
          $app->message('Адрес электронной почты изменен! На новый адрес выслано письмо для активации.',1);
          $mail = new Html('activate','user');
          $data['key'] = $app->user->gen_auth_key($data['id'],'user','activate');
          $mail->set_html($data);
          // TODO: добавить выставление ссылки на сайт и названия форума
          $app->mail(array('to'=>$data['email'],'subj'=>'Подтверждение регистрации на сайте','to_name'=>$data['login'],'text'=>$mail));
          return;
        }
      }
    }
    $result = new Html('ch_mail','user');
    return $result;
  }
}
